package com.kamistoat.meimeimall.common.annotation;

import javax.validation.constraints.NotBlank;
import java.lang.annotation.*;

/**
 * 在简单查询方法上添加的带缓查询注解。
 * 含有此注解的数据库查询方法会优先查询缓存，如果缓存命中则直接返回。否则才执行查询。
 * 查询结束后，再将查询结果入缓存。
 * 本身也是缓存击穿的解决方案。
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface WithCache {
    /**
     * 缓存的前缀，需要以正则表达式的形式给出，例如:
     * member:receiveAddress:#memberId:#isDefault
     * 的含义是： 从方法的输入参数中提取出 memberId 和 isDefault 拼接成缓存的键进行查询。
     * <p></p>
     * 允许以嵌套形式获取值: member:entity:#orderCreateVo.orderEntity.memberId
     */
    String prefix() default "";

    /**
     * 查询方法的返回值是否为列表
     */
    boolean isList() default false;

    /**
     * 查询方法的返回值类型。如果返回值是列表，则只写列表内部泛型类
     */
    Class<?> returnType() default Object.class;

}
